【レポート】Java アプリとAWS の良い関係 – AWS でJava アプリを実行する一番簡単な方法教えます #jjug_ccc #jjug_ccc_a
コンサル部のとばち(@toda_kk)です。
本記事は、2022年6月19日に開催されたオンラインカンファレンス JJUG CCC 2022 Spring にて行われたセッション「Java アプリとAWS の良い関係 - AWS でJava アプリを実行する一番簡単な方法教えます」のレポートです。
JJUG CCCは、例年2回、春と秋に開催する日本最大のJavaコミュニティイベントです。Java関連の技術や事例に関する良質なセッションが行われ、また異なる分野で活躍するJava技術者が一堂に会する場ともなっています。
このセッションでは、AWSソリューションアーキテクトの御三方によって、AWSにおけるJavaを用いたアプリケーション開発について解説してくれる内容になっています。
セッション概要
AWS には仮想マシン、コンテナ、サーバーレスなど、さまざまなアプリケーション実行方法の選択肢があります。また、皆さんがお気に入りのIDE から簡単にクラウドを使うための様々なツールや、開発を簡単にするためのCLI ツールなど、開発者の皆様のためのツールも多数用意しています。これらのツールを使いこなして、皆さんの開発したアプリケーションをクラウドにデプロイするための様々な方法をデモを交えてお見せしたいと思います。どんな時でもこれが一番、というものはありませんが、皆さんそれぞれにとって一番実行しやすい方法を見つけていただければと思います! また、合わせて、AI を使った静的コード解析など、開発者の皆さんをサポートするサービスも紹介します。
スピーカー
セッション資料
セッションレポート
AWSサービスを組み合わせてインフラを構築しよう
- インフラの管理とかをせず、もっと簡単に手早く良い感じにアプリケーションを動かしたい!!
- 組み合わせることで柔軟性が高い。
- 一方で、出てくる概念がたくさんあり管理の手間がかかる。
Java開発者がやりたいこと
- 手元で動くアプリケーションを 手軽に クラウド上でデプロイしたい。
- Dockerfileやインフラ管理のコード(Infrastructure as Code)を管理したくない。
- Javaのアプリケーションだけで動いてほしい。
AWS App Runner
- App Runnerによって柔軟なアプリケーションのビルドとデプロイを提供する。
- 構築済みのインフラにすぐにデプロイできる。
- 2つのデプロイ方法
- Dockerfileなしで、アプリケーションのソースコードだけからコンテナを実行することができる。
- Dockerfileを自分で用意して、コンテナイメージをレジストリにプッシュした上でApp Runnerで動かす、といったこともできる。
- IDEとの統合
- デプロイのプロセスで、IDEとブラウザを行ったり来たりするのが面倒。
- IntalliJ IDEAからAWSを操作できる。
- AWS Toolkitというプラグインをインストールすると、IDE上からアプリケーションをAWS上にデプロイできるようになる。
- IntelliJ IDEAからビルドログを確認する、といったことも可能。
- 変更を検知してデプロイする
- デプロイを自動化するパイプラインも提供される。
- Gitリポジトリに新しいソースコードをプッシュすると、変更を検知してApp Runnerに新しいバージョンがデプロイされる。
- Blue/Greenデプロイによってアプリケーションが更新される。
- デプロイを自動化するパイプラインも提供される。
- ロードマップが公開されている。
- https://github.com/aws/apprunner-roadmap/projects/1
- 気になるissueに +1 でvoteしましょう。
イベントドリブンな処理ではサーバーレスサービスを組み合わせる
- サーバーレスなサービスを組み合わせることで、インフラ管理を意識せず、コードを書くことだけに集中できる。
- 例えば、アプリケーションから画像をアップロードしてリサイズ処理をする。
- App RunnerからS3(オブジェクトストレージのサービス)にファイルをアップロードする。
- アップロードを検知したら、AWS Lambda(サーバーレスなコンピュートサービス)によってリサイズ処理を実行する。
- LambdaはAPI GatewayやDynamoDBといったさまざまなサービスと統合できる。
- Lambdaのスケールの仕組み。
- リソース管理(CPU、メモリ、アーティファクトのバージョンなど)はマネージドになっている。
- リクエストの増加に応じて、リソースが水平スケールする仕組みがビルドインされている。
- AWS SAM(Serverless Application Model)によって、サーバーレス構築を簡単にできる。
- AWSリソースのIaCサービスであるCloudFormationを抽象化してくれる。
- AWS SAM transform: テンプレートを管理する仕組み
- AWS SAM CLI: CLIツール
sam build
やsam deploy
コマンドによってアプリケーションをLambdaにデプロイできる。sam local generate-event
やsam local invoke
コマンドによってサーバーレスのローカルテストをサポートしている。sam logs
コマンドで、Lambda関数で実行されているアプリケーションログを確認できる。
- JavaでLambda関数を開発する際は、AWS SDKを利用することでシンプルな実装ができる。
セキュリティを含めたコード品質の担保
- 機械学習を用いてアプリケーションを改善するサービスとして、Amazon CodeGuruがある。
- CodeGuru Reviewer: クリティカルな問題やバグを特定して、改善方法を提示する機能。
- CodeGuru Profiler: アプリケーションのパフォーマンス状況を可視化して、最も実行コストが高いコード行特定し改善方法を提示する機能。
- コードレビューのプロセスは煩雑化、ボトルネックになりがち。
- プロセスにCodeGuru Reviewerを導入することで、簡単にコード品質を向上させることができる。
- セキュリティトークンのハードコードを検知したり、
- CodeGuru Reviewerによって指摘できる内容は、CodeGuru Reviewer Detector Libraryとして公開されている。
AWS Hands-on for Beginners
- これからAWS上でアプリケーション開発を始める方向けに、おすすめコンテンツとしてAWS Hands-on for Beginnersがある。
質疑応答
- App Runnerを閉域網(パブリックインターネットからのアクセス不可)で利用できるか?
- 現状ではプライベートネットワークでの実行はサポートされていない。
- App Runnerの前段に配置されるApplication Load BalancerにWAFをアタッチすることで、パブリックなエンドポイントに対してある程度リクエストを制御することはできる。
- ロードマップにissueが上がっており、リクエストがたくさんある。
- GitHub以外でサポートされているGitサービスは何があるか? また、自前のサーバに乗せているGitLab Community EditionやGitHub Enterpriseなどはサポートされているか?
- GItHubのみが対応。実は現状ではまだ、AWS CodeCommitも対応していない。
- ロードマップにissueが上がっており、リクエストがたくさんある。
- [https://github.com/aws/apprunner-roadmap/issues/3](https://github.com/aws/apprunner-roadmap/issues/3]
- AWS CopilotというCLIツールを利用することで、Gitリポジトリと連携して、コンテナをビルドしてデプロイするパイプラインを自動で生成することができる。
- App RunnerやBeanstalkは、かゆいところに手が届かない印象がある。選定する際の基準はあるか?
- App RunnerやBeanstalkのようなマネージドな領域が広いサービスは、容易に使える反面、柔軟性とのトレードオフが出てきてしまう。
- 最初はフルマネージドなサービスを試していただくのが良い。
- その上で、どうしてもかゆいところに手が届かない場合は、コンテナであればECSを試したり、最終的には仮想マシンとしてEC2を使う、といった形でマネージドな領域を狭めていくような剪定をしてもらうのが良い。
- CloudWatch Logsのロググループはどこで指定するのか?
- App Runnerで出力されるログの出力先となるロググループは、自動で作成されるので意識する必要はない。
- AWS Toolkitでは、CloudWatch Logsと連携しているのでロググループを明示的に指定できる。
- CDKもv2になった今、AWSのリソースを何で管理すれば良いのか悩ましい。特に、Lambdaをおまけ的にしか使っていない組織では、Lambdaの管理をどうすれば良いか?
- CDKとSAMが連携できるようになっており、CDKからSAMの実行JSONを出力できる。
- 基本的にCDKでリソースを作成しつつ、ローカルテストをしたいときはJSONを出力してSAMで実行する、といった使い方が良いのではないか。
- SAM CLIを使用してLambda関数の実行ログを確認できる機能は、開発言語にかかわらず利用できるか?
- 開発言語にかかわらず、ログを確認できる。
- App Runnerでsecretsを渡す方法のベストプラクティスは?
- Systems Manager Parameter StoreやSecrets Managerで管理するのがベストプラクティスとなっている。
- Java用のAWS SDKからアクセスできるようになっている。
- App Runnerとの統合について、ロードマップにissueが上がっており、リクエストがたくさんある。
AWSのマネージドサービスを使ってJavaアプリケーションを良い感じにデプロイしよう
Javaに限らず、アプリケーションを開発する上でインフラのことは意識したくないというのは、多くの開発者の方が思うことでしょう。
AWSではさまざまなニーズに合わせたマネージドサービスが提供されており、上手く選定したり組み合わせることで、インフラ管理を簡単にしながらアプリケーションを実行することができます。
かゆいところに手が届かない場合でも、まずはマネージドサービスを試しつつ、後から他のサービスに簡単に移行できるなど柔軟な対応ができる点が、AWSはじめクラウドサービスの強いところだと改めて感じました。
個人的な感想としては、Java + AWSという点によりフォーカスした事例などがあれば、ぜひ知りたいと思いました。
以上、コンサル部のとばち(@toda_kk)でした。